#!/usr/bin/env python
# -*- coding:utf-8 -*-
'''
@File    :   learn_argument.py
@Time    :   2024/12/27 21:02:38
@Author  :   xiangyu Chen
@Version :   1.0
@Contact :   yu112yu@sina.com
@License :   (C)Copyright 2017-2018, Liugroup-NLPR-CASIA
@Desc    :   参数
'''
__private_var = "I am __private variable"
_private_var = "I am _private variable"
public_var = "I am public variable"


def learn_default(L=[], R=9999999):
    """_summary_
    定义默认参数要牢记一点：默认参数必须指向不变对象！
    函数在定义的时候，默认参数 L 的值就被计算出来了
    Parameters
    ----------
    L : list, optional
        _description_, by default []
    """

    print("id(L):", id(L))
    print("id(R):", id(R))
    L.append(1)
    R = R+1
    return L, R


def var_para(*numbers):
    """_summary_
    定义可变参数和定义一个 list 或 tuple 参数相比，仅仅在参数前面加了一个*号。
    在函数内部，参数 numbers 接收到的是一个 tuple。
    但是，调用该函数时，可以传入任意个参数，包括 0 个参数。
    调用可变参数:
        call((nums[0], nums[1], nums[2]))
        call(*nums)

    Returns
    -------
    _type_
        _description_
    """
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum


def keyword_para(name, age=18, **kwargs):
    """_summary_
    关键字参数允许你传入 0 个或任意个含参数名的参数.
    这些关键字参数在函数内部自动组装为一个 dict。
    """
    print(name)
    print(age)
    print(kwargs)
    for key, value in kwargs.items():
        print(f'{key}: {value}')


def combination_para(a, b, c=0, *args, **kw):
    """_summary_
    参数定义的顺序必须是：必选参数、默认参数、可变参数/命名关键字参数和关键字参数。
    可变参数无法和命名关键字参数混合

    Parameters
    ----------
    a : _type_
        _description_
    b : _type_
        _description_
    c : int, optional
        _description_, by default 0
    """
    print(a, b, c, args, kw)


def test_para(a, b, c, d=None):
    print(b, c, d)


def none_para():
    print('None参数：', __name__)


if __name__ == '__main__':
    print('\n\n')
    firstcall = learn_default()
    print('第一次调用learn_default()             : ',
          firstcall, id(firstcall[0]), id(firstcall[1]), '\n')
    secondcall = learn_default()
    print('第二次调用learn_default()             : ',
          secondcall, id(secondcall[0]), id(secondcall[1]), '\n')
    thirdcall = learn_default([], 9999999)
    print('第三次,用参数调用learn_default([],999)      : ',
          thirdcall, id(thirdcall[0]), id(thirdcall[1]), '\n')

    nums = [1, 2, 3]
    print("可变参数传值，元素分别传入： ", var_para(nums[0], nums[1], nums[2]))
    print("可变参数传值，*传入： ", var_para(*nums[1:3]))

    print('关键字参数=====')
    keyword_para('Bob',  city='Beijing', gender='M', job='Engineer')
    keyword_para('Dvaid')
    print('===========')

    test_para(3, c=2, b=1)

    print('对于任意函数，都可以通过类似 func(*args, **kw)的形式调用它============')
    test_para(**{'a': 1, 'b': 2, 'c': 3})
    none_para(**{})
    combination_para(*('Patty', 'bb'), **{'d': 2})
    print('===========')
